﻿using Levfier.GUI.EditorControls.Parameters;
using Levfier.Proccessors;
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Media;

namespace Levfier.GUI.EditorControls.Chains
{
    /// <summary>
    /// パラメータとプロセッサを接続する
    /// </summary>
    [Serializable]
    public class ParameterChainControl : LinkControl
    {
        /// <summary>
        /// 通常時の色
        /// </summary>
        private readonly Brush normalBrush = Brushes.LightGreen;

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="upperControl">パラメータコントロール</param>
        /// <param name="lowerControl">プロセッサコントロール</param>
        public ParameterChainControl(Parameters.ParameterControl upper, ProccessorControl lower)
            : base(upper, lower)
        {
            //接続
            upper.SetParameterChainControl(this);
            lower.DependencyControls.Add(this);

            //描画に関する処理
            this.lineCreater = new ChainLineCreater();
            this.Width = 5000;
            this.Height = 5000;
            this.lineCreater.Stroke = this.normalBrush;

            this.Update();

            //TODO パラメータとパラメータコントロールを繋ぐ
            IProccessable proccessor = lower.GetProccessor();
            upper.SetParameters(proccessor.GetParameters());
        }

        /// <summary>
        /// 選択された時の動作
        /// </summary>
        /// <param name="sender"></param>
        public override void Select(object sender)
        {
            this.lineCreater.Stroke = this.selectedBrush;
            this.Update();
        }

        /// <summary>
        /// 選択解除された時の動作
        /// </summary>
        /// <param name="sender"></param>
        public override void Unselect(object sender)
        {
            this.lineCreater.Stroke = this.normalBrush;
            this.Update();
        }

        /// <summary>
        /// 自分自身を削除する
        /// </summary>
        public override IEnumerable<UIElement> Delete()
        {
            IList<UIElement> deleteTargets = new List<UIElement>();

            ParameterControl upperPram = this.upper as ParameterControl;
            ProccessorControl lowerPro = this.lower as ProccessorControl;
            upperPram.RemoveParameterChainControl(this);
            lowerPro.DependencyControls.Remove(this);
            this.Children.Clear();
            deleteTargets.Add(this);
            return deleteTargets;
        }
    }
}
